﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//给定两个字符串 s 和 t ，判断它们是否是同构的。
//如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。
//每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。
// 不同字符不能映射到同一个字符上，相同字符只能映射到同一个字符上，字符可以映射到自己本身。
//
//输入：s = "egg", t = "add"
//输出：true

//struct HashTable {
//    char key;
//    char val;
//    UT_hash_handle hh;
//};
//
//bool isIsomorphic(char* s, char* t) {
//    struct HashTable* s2t = NULL;
//    struct HashTable* t2s = NULL;
//    int len = strlen(s);
//    for (int i = 0; i < len; ++i) {
//        char x = s[i], y = t[i];
//        struct HashTable* tmp1, * tmp2;
//        HASH_FIND(hh, s2t, &x, sizeof(char), tmp1);
//        HASH_FIND(hh, t2s, &y, sizeof(char), tmp2);
//        if (tmp1 != NULL) {
//            if (tmp1->val != y) {
//                return false;
//            }
//        }
//        else {
//            tmp1 = malloc(sizeof(struct HashTable));
//            tmp1->key = x;
//            tmp1->val = y;
//            HASH_ADD(hh, s2t, key, sizeof(char), tmp1);
//        }
//        if (tmp2 != NULL) {
//            if (tmp2->val != x) {
//                return false;
//            }
//        }
//        else {
//            tmp2 = malloc(sizeof(struct HashTable));
//            tmp2->key = y;
//            tmp2->val = x;
//            HASH_ADD(hh, t2s, key, sizeof(char), tmp2);
//        }
//    }
//    return true;
//}






/*
已知存在一个按非降序排列的整数数组 nums ，数组中的值不必互不相同。

在传递给函数之前，nums 在预先未知的某个下标 k（0 <= k < nums.length）上进行了 旋转 ，
使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
（下标 从 0 开始 计数）。例如， [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。
给你 旋转后 的数组 nums 和一个整数 target ，请你编写一个函数来判断给定的目标值是否存在于数组中。
如果 nums 中存在这个目标值 target ，则返回 true ，否则返回 false 。
你必须尽可能减少整个操作步骤。
输入：nums = [2,5,6,0,0,1,2], target = 0
输出：true*/
/*
bool search(int* nums, int numsSize, int target) {
    if (numsSize == 0) {
        return false;
    }
    if (numsSize == 1) {
        return nums[0] == target;
    }
    int l = 0, r = numsSize - 1;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (nums[mid] == target) {
            return true;
        }
        if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
            ++l;
            --r;
        } else if (nums[l] <= nums[mid]) {
            if (nums[l] <= target && target < nums[mid]) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        } else {
            if (nums[mid] < target && target <= nums[numsSize - 1]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
    }
    return false;
}
*/